package com.atguigu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 一、@RequestMapping 所标识的位置：
 * 1.在类上标识：设置映射请求路径的初始信息
 * 2.在方法上标识：设置映射请求路径的具体信息
 * 二、@RequestMapping 注解value 属性：
 * 作用：通过请求的请求路径来匹配请求
 * value 属性是数组类型，即当前浏览器所发送请求路径匹配value属性中的任何一个值
 * 则当前请求就会被注解所标识的方法进行处理
 * 三、@RequestMapping 注解的 method 属性
 * 作用：通过请求的请求方式匹配请求
 * method 属性是 RequestMethod 类型的数组，即当前浏览器所发送请求
 * 的请求方式匹配的method 属性中的任何一种请求方式，则当前请求就会被
 * 注解所标识的方法进行处理
 * 若浏览器所发送的请求的请求路径和映射相同，但是请求方法和映射中设置的不一致就会 405
 * 405 - Request method 'get' not supported
 * @GetMapping,@PostMapping,@DeleteMapping,@PutMapping
 * 四、@RequestMapping 注解的 params 属性
 * 作用：通过请求的请求参数匹配请求，即浏览器发送的请求的参数必须满足params 属性的设置
 * params 可以使用四种表达式：
 * "param":表示当前所匹配的请求的参数中必须携带 param 参数
 * "!param":表示当前所匹配的请求的参数中不能携带 param 参数
 * "param=value":表示当前所匹配的请求的参数中必须携带 param 参数，且参数值必须为 value
 * "param!=value":表示当前所匹配的请求中的请求参数可以不携带 param ，若携带参数，值一定不能是 value
 * 400 - Parameter conditions "username" not met for actual request
 * 五、@RequestMapping 的 headers 属性
 * 作用：通过请求的请求头信息匹配请求，即浏览器发送的请求的请求头必须满足 headers 属性的设置
 * 若浏览器所发送的请求的请求路径和GRequestMapping注解vaLue属性匹配，但是请求头信息不匹配此时页面报错:404
 * 六、支持 ant 风格的路径
 * ？：表示任意的单个字符
 * *：表示任意的0个或多个字符
 * **：表示任意层数的任意目录
 * 七、@RequestMapping 注解使用路径占位符
 * 传统 : /deleteUser?id=1
 * rest: /user/delete/1
 * 需要在@RequestMapping注解的value属性中所设置的路径中，
 * 使用{xx}的方式表示路径中的数据在通过@Pathvariable注解,
 * 将占位符所标识的值和控制器方法的形参进行绑定
 */
 // 注意：在使用**时，只能使用/**/xxx的方式
@Controller
@RequestMapping("/test")
public class TestRequestMappingController {
    @RequestMapping(
            value={"/hello","/abc"},
            method = {RequestMethod.GET,RequestMethod.POST},
            //params = {"username","!password","age=20","gender!=女"}
            headers = {"referer"}
    )
    public String hello(String username,String password){
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
    @RequestMapping("/**/test/ant")
    public String testAnt(){
        return "success";
    }
    @RequestMapping("/rest/user/{uuid}/{Id}")
    public String testRest(@PathVariable("Id") Integer Id,@PathVariable("uuid") String uuid){
        System.out.println("id:"+Id+",uuid:"+uuid);
        return "success";
    }
    //通过servletAPI获取
    @RequestMapping("testParam")
    public String testParam(HttpServletRequest request){
        request.setAttribute("userInfo","用户信息");
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
    //通过控制器方法的形参获取请求参数
    public String testParam(String username,String password){
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}
